package com.insta.formation.calendar;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.insta.formation.calendar.dao.impl.HibernateUtil;
import com.insta.formation.calendar.model.Calendar;
import com.insta.formation.calendar.model.Event;
import com.insta.formation.calendar.model.Person;

public class Launcher
{

	private static Logger LOGGER = LoggerFactory.getLogger(Launcher.class);

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		Session session = HibernateUtil.INSTANCE.getSession();
		session.beginTransaction();
		// creation d'un personne avec les events associés
		// sauvegarde des données dans la base de données avec Hibernate
		Person p = new Person();
		p.setFirstName("name");
		p.setLastName("forname");
		session.saveOrUpdate(p);

		Event event = new Event();
		event.setName("event1");

		for (int i = 1; i <= 5; i++) {

			Person guest = new Person();
			guest.setFirstName("name" + i);
			guest.setLastName("forname" + i);
			session.saveOrUpdate(guest);
			event.addGuest(guest);
		}
		event.setCreator(p);
		p.addEvent(event);

		session.saveOrUpdate(p);

		Calendar cal = new Calendar();
		cal.setName("calendar1");
		cal.setOwner(p);
		session.saveOrUpdate(cal);
		session.getTransaction().commit();
		// session.createSQLQuery("SHUTDOWN;"); // HSQLDB

		Query q = session.createQuery("from Event e where e.id = :id");
		q.setInteger("id", 1);
		List<Event> events = q.list();
		for (Event ev : events) {
			LOGGER.info(ev.getCreator().toString());
		}

		session.close();
		// /**
		// * Requete HQL qui affiche les noms des personnes
		// */
		// Query query = session.createQuery("select name from Person");
		// List<String> list = query.list();
		// LOGGER.info("nb element = " + list.size());
		// for (String string : list) {
		// LOGGER.info(string);
		// }
		//
		// /**
		// * Requete HQL avec un parametre (named parameter (preferred))
		// */
		// Query q = session.createQuery("from Person p where p.name = :name");
		// q.setString("name", "name1");
		// List<Person> personList = q.list();
		// for (Person pers : personList) {
		// LOGGER.info(pers.getForname());
		// }
		//
		// /**
		// * Requete HQL qui retourne des tuples (name,forname) des personnes
		// sous
		// * forme de tableau d'objets
		// */
		// Iterator nameAndForname =
		// session.createQuery("select name, forname from Person").list().iterator();
		// while (nameAndForname.hasNext()) {
		// Object[] tuple = (Object[]) nameAndForname.next();
		// LOGGER.info(tuple[0] + " " + tuple[1]);
		// }
		//
		// /**
		// * Requete HQL avec un fichier de mapping contenant la requête HQL
		// * (calendar.hbm.sql)
		// */
		// q = session.getNamedQuery("getPerson");
		// q.setString(0, "name2");
		// q.setString(1, "forname2");
		// personList = q.list();
		// for (Person pers : personList) {
		// LOGGER.info(pers.getForname());
		// }
		//
		// /**
		// * Requete en utilisant un Criteria. Criteria est une API de recherche
		// * orientée objet.
		// */
		// Criteria crit =
		// session.createCriteria(Person.class).add(Restrictions.eq("name",
		// "sadaoui")).add(Restrictions.eq("forname", "julien"));
		// crit.setMaxResults(50);
		// personList = crit.list();
		// for (Person pers : personList) {
		// LOGGER.info(pers.getForname());
		// }
		//
		// LOGGER.info("FINISH");
	}
}
